package com.wson.adapter.clouddisk.factory;

import com.wson.adapter.clouddisk.impl.CodiskAdapterCoolpanImpl;
import com.wson.adapter.clouddisk.impl.CodiskAdapterKuaipanImpl;
import com.wson.adapter.codisk.ICodiskAdapter;
import com.wson.model.clouddisk.account.ICodiskAccountManip;
import com.wson.model.clouddisk.account.ICodiskAccountMeta;
import com.wson.model.clouddisk.account.ICodiskAccountView;
import com.wson.model.clouddisk.provider.ICodiskProviderManip;
import com.wson.model.clouddisk.provider.ICodiskProviderMeta;
import com.wson.model.clouddisk.provider.ICodiskProviderView;
import com.wson.platform.factory.impl.BeanFactory;
import com.wson.root.util.ExceptionUtil;
import com.wson.root.util.LoggerUtil;

public class CodiskAdapterFactory {
	public static ICodiskAdapter getAdapter(Long accountID){
		//CodiskAccountModel account = new  CodiskAccountModel();
		ICodiskAccountView account = (ICodiskAccountView)BeanFactory.getCurrentFactory().getModelFactory().getModel(ICodiskAccountMeta.META_ID);
		((ICodiskAccountManip)account).setID(accountID);
		try{
			if(account.getID()!=null 
					&& account.selfSelect())
				return getAdapter(account);
			else
				LoggerUtil.WARNING("Account "+account.getID()+" is not existed!");
			
		}
		catch(Exception ex){
			LoggerUtil.DEBUG(ex);
		}
		return null;
	}
/*	public static ICodiskAdapter getAdapter(Long providerID){
		CodiskProviderModel provider = new  CodiskProviderModel();
		provider.setID(providerID);
		try{
			if(provider.getID()!=null && provider.selfSelect())
				return getAdapter(provider);
		}
		catch(Exception ex){
			LoggerUtil.DEBUG(ex);
		}
		return null;
	}*/
	public static ICodiskAdapter getAdapter(Long accountID, Long providerID){
		ICodiskAccountView account = (ICodiskAccountView)BeanFactory.getCurrentFactory().getModelFactory().getModel(ICodiskAccountMeta.META_ID);
		((ICodiskAccountManip)account).setID(accountID);
		try{
			if(account.getID()!=null && account.selfSelect())
				return getAdapter(account);
		}
		catch(Exception ex){
			LoggerUtil.DEBUG(ex);
		}
		return null;
	}
	public static ICodiskAdapter getAdapter(com.wson.model.clouddisk.provider.ICodiskProviderView provider){
		return getAdapter(null, provider);
		
	}
	
	public static ICodiskAdapter getAdapter(com.wson.model.clouddisk.account.ICodiskAccountView account, com.wson.model.clouddisk.provider.ICodiskProviderView provider){
		if(ICodiskProviderMeta.PROVIDER_KUAIPAN==provider.getID())
			return new CodiskAdapterKuaipanImpl(account, provider);
		if(ICodiskProviderMeta.PROVIDER_KANBOX==provider.getID())
			return new CodiskAdapterCoolpanImpl(account, provider);		
		return null;
	}
	
	public static ICodiskAdapter getAdapter(ICodiskAccountView account){
		if(account!=null 
				&& account.getID()!=null ){
			
			if(account.getAppKey()!=null 
					&& account.getAppSecret()!=null
					&& account.getProviderID()!=null){
				ICodiskProviderView provider = (ICodiskProviderView)BeanFactory.getCurrentFactory().getModelFactory().getModel(ICodiskProviderMeta.META_ID);
				((ICodiskProviderManip)provider).setID(account.getProviderID());
				((ICodiskProviderManip)provider).setAppKey(account.getAppKey());
				((ICodiskProviderManip)provider).setAppSecret(account.getAppSecret());
				
				return getAdapter(account, provider);
			}
			else if(account.getProviderID()!=null){
			
				ICodiskProviderView provider = (ICodiskProviderView)BeanFactory.getCurrentFactory().getModelFactory().getModel(ICodiskProviderMeta.META_ID);
				((ICodiskProviderManip)provider).setID(account.getProviderID());
				try{
					if(provider.getID()!=null 
							&& provider.selfSelect())
						return getAdapter(account, provider);
					else
						LoggerUtil.WARNING("provider "+account.getProviderID()+" is not existed!");
				}
				catch(Exception ex){
					ExceptionUtil.handleException(ex);
				}
			}
		}
		else{
			LoggerUtil.WARNING("Invalid codisk account "+account);
		}
		return null;
	}
}
